home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / puma.lha / puma / src / Parser.lalr < prev    next >
Text File  |  1992-09-25  |  23KB  |  636 lines

  1.  PARSER Parser
  2. GLOBAL {
  3.  
  4.  
  5. FROM StringMem    IMPORT GetString, PutString;
  6. FROM Strings    IMPORT tString, SubString, Length, ArrayToString, IntToString, Concatenate;
  7. FROM Idents    IMPORT tIdent, NoIdent, MakeIdent;
  8. FROM Texts    IMPORT tText, MakeText;
  9. FROM Scanner    IMPORT BeginScanner, tScanAttribute, Attribute, Warning;
  10. FROM Positions    IMPORT tPosition, NoPosition;
  11.  
  12. FROM Tree    IMPORT
  13.    mSpec    , mCodes    , mAttrDesc    , mDesignator    ,
  14.    mLayoutAny    , mNoLayout    , mAnys        ,
  15.    mNoDesignator, mIdent    , mAny        , mNamedExpr    ,
  16.    mNoName    , mName        , mNoTreeName    , mTreeName    ,
  17.    mNoRoutine    , mPredicate    , mProcedure    , mFunction    ,
  18.    mType    , mNoParameter    , mParam    , mNoRule    ,
  19.    mRule    , mNoExpr    , mCompose    , mVarUse    ,
  20.    mTargetExpr    , mDontCare1    , mDontCare    , mOneExpr    ,
  21.    mNoStatement    , mTargetStmt    , mAssignment    , mCall        ,
  22.    mBinary    , mPreOperator    , mPostOperator    , mParents    ,
  23.    mProcCall    , mReject    , mFail        , mNl        ,
  24.    mStringExpr    , mNil        , mIndex    , Nil        ,
  25.    mOnePatternsList, mNoPatternsList    , OnePatternsList    ,
  26.    tTree    , Compose    , VarUse    , CopyTree    ,
  27.    TreeRoot    , MakeTree    , Codes        , ReverseTree    ;
  28.  
  29. VAR
  30.    String1, String2    : tString;
  31.    NameCount        : INTEGER;
  32.    Line            : tPosition;
  33.    nNoParameter, nNoName, nNoRule, nNoDesignator,
  34.    nNoStatement, nNoLayout, nNoPatternsList: tTree;
  35.  
  36. PROCEDURE mRules (Line: tPosition; Patterns, Exprs, Expr, Statements, Next: tTree): tTree;
  37.    VAR Tree    : tTree;
  38.    BEGIN
  39.       Tree := mRule (Line, Patterns^.OnePatternsList.Patterns, Exprs, Expr, Statements, Next);
  40.       Patterns := Patterns^.OnePatternsList.Next;
  41.       WHILE Patterns^.Kind = OnePatternsList DO
  42.      Tree := mRule (Line, Patterns^.OnePatternsList.Patterns, CopyTree (Exprs),
  43.             CopyTree (Expr), CopyTree (Statements), Tree);
  44.      Patterns := Patterns^.OnePatternsList.Next;
  45.       END;
  46.       RETURN Tree;
  47.    END mRules;
  48.  
  49. TYPE
  50. yyTrafoName = RECORD Id: tIdent; END;
  51. yyTreePart = RECORD Tree: tTree; END;
  52. yyTreeNames = RECORD Tree: tTree; END;
  53. yyPublicPart = RECORD Tree: tTree; END;
  54. yyExternPart0 = RECORD Tree: tTree; END;
  55. yyExternPart = RECORD Tree: tTree; END;
  56. yyNames = RECORD Tree: tTree; END;
  57. yyCodes = RECORD Tree: tTree; END;
  58. yyRoutines = RECORD Tree: tTree; END;
  59. yyOutParameters = RECORD Tree: tTree; END;
  60. yyParameters = RECORD Tree: tTree; END;
  61. yyMode = RECORD IsRef: BOOLEAN; END;
  62. yyDeclarations = RECORD Tree: tTree; END;
  63. yyType = RECORD Tree: tTree; END;
  64. yyLocalCode = RECORD Text: tText; Position: tPosition; END;
  65. yyRules = RECORD Tree: tTree; END;
  66. yyPatterns = RECORD Tree: tTree; END;
  67. yyPatterns2 = RECORD Tree: tTree; END;
  68. yyExprs = RECORD Tree: tTree; END;
  69. yyNamedExprs = RECORD Tree: tTree; END;
  70. yyExprs2 = RECORD Tree: tTree; END;
  71. yyNamedExprs2 = RECORD Tree: tTree; END;
  72. yyExpr = RECORD Tree: tTree; END;
  73. yyPrefixExpr = RECORD Tree: tTree; END;
  74. yyPostfixExpr = RECORD Tree: tTree; END;
  75. yyPrimaryExpr = RECORD Tree: tTree; END;
  76. yyStatements = RECORD Tree: tTree; END;
  77. yyTargetCodes = RECORD Tree: tTree; END;
  78. yyName0 = RECORD Id: tIdent; Position: tPosition; END;
  79. yyName1 = RECORD Id: tIdent; Position: tPosition; END;
  80. yySpace = RECORD Tree: tTree; END;
  81.  
  82. tParsAttribute = RECORD CASE : SHORTCARD OF
  83.   0: Scan: Scanner.tScanAttribute;
  84. | 1: TrafoName: yyTrafoName;
  85. | 2: TreePart: yyTreePart;
  86. | 3: TreeNames: yyTreeNames;
  87. | 4: PublicPart: yyPublicPart;
  88. | 5: ExternPart0: yyExternPart0;
  89. | 6: ExternPart: yyExternPart;
  90. | 7: Names: yyNames;
  91. | 8: Codes: yyCodes;
  92. | 9: Routines: yyRoutines;
  93. | 10: OutParameters: yyOutParameters;
  94. | 11: Parameters: yyParameters;
  95. | 12: Mode: yyMode;
  96. | 13: Declarations: yyDeclarations;
  97. | 14: Type: yyType;
  98. | 15: LocalCode: yyLocalCode;
  99. | 16: Rules: yyRules;
  100. | 17: Patterns: yyPatterns;
  101. | 18: Patterns2: yyPatterns2;
  102. | 19: Exprs: yyExprs;
  103. | 20: NamedExprs: yyNamedExprs;
  104. | 21: Exprs2: yyExprs2;
  105. | 22: NamedExprs2: yyNamedExprs2;
  106. | 23: Expr: yyExpr;
  107. | 24: PrefixExpr: yyPrefixExpr;
  108. | 25: PostfixExpr: yyPostfixExpr;
  109. | 26: PrimaryExpr: yyPrimaryExpr;
  110. | 27: Statements: yyStatements;
  111. | 28: TargetCodes: yyTargetCodes;
  112. | 29: Name0: yyName0;
  113. | 30: Name1: yyName1;
  114. | 31: Space: yySpace;
  115. END; END;
  116. }
  117.  
  118. EXPORT {
  119. }
  120.  
  121. LOCAL {
  122. }
  123.  
  124. BEGIN {
  125.  
  126.    BeginScanner;
  127.    NameCount := 0;
  128.    nNoParameter        := mNoParameter        ();
  129.    nNoName         := mNoName        ();
  130.    nNoRule         := mNoRule        ();
  131.    nNoDesignator    := mNoDesignator    ();
  132.    nNoStatement        := mNoStatement        ();
  133.    nNoLayout        := mNoLayout        ();
  134.    nNoPatternsList    := mNoPatternsList    ();
  135.  
  136. }
  137.  
  138. CLOSE {
  139. }
  140.  
  141. TOKEN
  142.  
  143. Ident = 1
  144. Operator = 2
  145. IncOperator = 3
  146. TargetBlock = 4
  147. String = 5
  148. Number = 6
  149. TargetCode = 7
  150. WhiteSpace = 8
  151. '::' = 9
  152. TRAFO = 10
  153. 'TREE' = 11
  154. ',' = 12
  155. PUBLIC = 13
  156. EXTERN = 14
  157. ';' = 15
  158. 'EXPORT' = 16
  159. 'IMPORT' = 17
  160. 'GLOBAL' = 18
  161. 'BEGIN' = 19
  162. 'CLOSE' = 20
  163. PROCEDURE = 21
  164. '(' = 22
  165. REF = 23
  166. ':' = 24
  167. '.' = 25
  168. '[' = 26
  169. ']' = 27
  170. '=>' = 28
  171. ')' = 29
  172. 'LOCAL' = 30
  173. '..' = 31
  174. NIL = 32
  175. '_' = 33
  176. '{' = 34
  177. '}' = 35
  178. '->' = 36
  179. '^' = 37
  180. ':>' = 38
  181. ':=' = 39
  182. '?' = 40
  183. REJECT = 41
  184. FAIL = 42
  185. NL = 43
  186. RETURN = 44
  187. 'FUNCTION' = 45
  188. PREDICATE = 46
  189.  
  190. OPER
  191.  
  192. NONE  '{'
  193. NONE  HIGH
  194.  
  195. RULE
  196.  
  197. Trafo : TrafoName TreePart PublicPart ExternPart0 Codes Routines { ;
  198.  TreeRoot := mSpec ($1.TrafoName.Id, $2.TreePart.Tree, $3.PublicPart.Tree,
  199.          $4.ExternPart0.Tree, $5.Codes.Tree, ReverseTree ($6.Routines.Tree)); ;
  200.  ;
  201. } .
  202. TrafoName : { ArrayToString ("Trafo", String1); $$.TrafoName.Id := MakeIdent (String1); ;
  203.   ;
  204. } .
  205. TrafoName : TRAFO Name0 {$$.TrafoName.Id := $2.Name0.Id;
  206. } .
  207. TreePart : { ArrayToString ("Tree", String1);
  208.         $$.TreePart.Tree := mTreeName (MakeIdent (String1), Attribute.Position, mNoTreeName ()); ;
  209.  ;
  210. } .
  211. TreePart : 'TREE' TreeNames { $$.TreePart.Tree := ReverseTree ($2.TreeNames.Tree);
  212.  ;
  213. } .
  214. TreeNames : { $$.TreeNames.Tree := mNoTreeName ();
  215.  ;
  216. } .
  217. TreeNames : TreeNames ',' {$$.TreeNames.Tree := $1.TreeNames.Tree;
  218. } .
  219. TreeNames : TreeNames Name0 { $$.TreeNames.Tree := mTreeName ($2.Name0.Id, $2.Name0.Position, $1.TreeNames.Tree);
  220.  ;
  221. } .
  222. PublicPart : { $$.PublicPart.Tree := nNoName;
  223.  ;
  224. } .
  225. PublicPart : PUBLIC Names { $$.PublicPart.Tree := ReverseTree ($2.Names.Tree);
  226.  ;
  227. } .
  228. ExternPart0 : { $$.ExternPart0.Tree := nNoName;
  229.  ;
  230. } .
  231. ExternPart0 : EXTERN Names OptSemiColon { $$.ExternPart0.Tree := ReverseTree ($2.Names.Tree);
  232.  ;
  233. } .
  234. ExternPart : { $$.ExternPart.Tree := nNoName;
  235.  ;
  236. } .
  237. ExternPart : EXTERN Names ';' { $$.ExternPart.Tree := ReverseTree ($2.Names.Tree);
  238.  ;
  239. } .
  240. Names : { $$.Names.Tree := nNoName;
  241.  ;
  242. } .
  243. Names : Names ',' {$$.Names.Tree := $1.Names.Tree;
  244. } .
  245. Names : Names Name0 { $$.Names.Tree := mName ($2.Name0.Id, $2.Name0.Position, $1.Names.Tree);
  246.  ;
  247. } .
  248. Codes : { $$.Codes.Tree := MakeTree (Codes);
  249.  ;
  250. } .
  251. Codes : Codes 'EXPORT' TargetBlock { $$.Codes.Tree := $1.Codes.Tree;
  252.         $$.Codes.Tree^.Codes.Export     := $3.Scan.TargetBlock.Text;
  253.         $$.Codes.Tree^.Codes.ExportLine := $3.Scan.Position; ;
  254.  ;
  255. } .
  256. Codes : Codes 'IMPORT' TargetBlock { $$.Codes.Tree := $1.Codes.Tree;
  257.         $$.Codes.Tree^.Codes.Import     := $3.Scan.TargetBlock.Text;
  258.         $$.Codes.Tree^.Codes.ImportLine := $3.Scan.Position; ;
  259.  ;
  260. } .
  261. Codes : Codes 'GLOBAL' TargetBlock { $$.Codes.Tree := $1.Codes.Tree;
  262.         $$.Codes.Tree^.Codes.Global     := $3.Scan.TargetBlock.Text;
  263.         $$.Codes.Tree^.Codes.GlobalLine := $3.Scan.Position; ;
  264.  ;
  265. } .
  266. Codes : Codes 'BEGIN' TargetBlock { $$.Codes.Tree := $1.Codes.Tree;
  267.         $$.Codes.Tree^.Codes.Begin      := $3.Scan.TargetBlock.Text;
  268.         $$.Codes.Tree^.Codes.BeginLine  := $3.Scan.Position; ;
  269.  ;
  270. } .
  271. Codes : Codes 'CLOSE' TargetBlock { $$.Codes.Tree := $1.Codes.Tree;
  272.         $$.Codes.Tree^.Codes.Close      := $3.Scan.TargetBlock.Text;
  273.         $$.Codes.Tree^.Codes.CloseLine  := $3.Scan.Position; ;
  274.  ;
  275. } .
  276. Routines : { $$.Routines.Tree := mNoRoutine ();
  277.  ;
  278. } .
  279. Routines : Routines PROCEDURE Name0 '(' Parameters OutParameters ')' ExternPart LocalCode Rules { $$.Routines.Tree := mProcedure ($1.Routines.Tree, $3.Name0.Id, $3.Name0.Position,
  280.            $5.Parameters.Tree, $6.OutParameters.Tree, $8.ExternPart.Tree, $9.LocalCode.Text,
  281.            $9.LocalCode.Position, ReverseTree ($10.Rules.Tree));
  282.  ;
  283. } .
  284. Routines : Routines 'FUNCTION' Name0 '(' Parameters OutParameters ')' Type ExternPart LocalCode Rules { $$.Routines.Tree := mFunction ($1.Routines.Tree, $3.Name0.Id, $3.Name0.Position,
  285.            $5.Parameters.Tree, $6.OutParameters.Tree, $9.ExternPart.Tree, $10.LocalCode.Text,
  286.            $10.LocalCode.Position, ReverseTree ($11.Rules.Tree),
  287.            mParam (FALSE, NoIdent, NoPosition, $8.Type.Tree, nNoParameter));
  288.  ;
  289. } .
  290. Routines : Routines PREDICATE Name0 '(' Parameters OutParameters ')' ExternPart LocalCode Rules { $$.Routines.Tree := mPredicate ($1.Routines.Tree, $3.Name0.Id, $3.Name0.Position,
  291.            $5.Parameters.Tree, $6.OutParameters.Tree, $8.ExternPart.Tree, $9.LocalCode.Text,
  292.            $9.LocalCode.Position, ReverseTree ($10.Rules.Tree));
  293.  ;
  294. } .
  295. OutParameters : { $$.OutParameters.Tree := nNoParameter;
  296.  ;
  297. } .
  298. OutParameters : '=>' Parameters {$$.OutParameters.Tree := $2.Parameters.Tree;
  299. } .
  300. Parameters : { $$.Parameters.Tree := nNoParameter;
  301.  ;
  302. } PREC HIGH .
  303. Parameters : Mode Ident ':' Type { $$.Parameters.Tree := mParam ($1.Mode.IsRef, $2.Scan.Ident.Ident, $2.Scan.Position, $4.Type.Tree, nNoParameter);
  304.  ;
  305. } .
  306. Parameters : Mode Type { ArrayToString ("yyP", String1); INC (NameCount);
  307.            IntToString (NameCount, String2); Concatenate (String1, String2);
  308.            $$.Parameters.Tree := mParam ($1.Mode.IsRef, MakeIdent (String1), NoPosition, $2.Type.Tree, nNoParameter); ;
  309.  ;
  310. } .
  311. Parameters : Mode Ident ':' Type ',' Parameters { $$.Parameters.Tree := mParam ($1.Mode.IsRef, $2.Scan.Ident.Ident, $2.Scan.Position, $4.Type.Tree, $6.Parameters.Tree);
  312.  ;
  313. } .
  314. Parameters : Mode Type ',' Parameters { ArrayToString ("yyP", String1); INC (NameCount);
  315.            IntToString (NameCount, String2); Concatenate (String1, String2);
  316.            $$.Parameters.Tree := mParam ($1.Mode.IsRef, MakeIdent (String1), NoPosition, $2.Type.Tree, $4.Parameters.Tree); ;
  317.  ;
  318. } .
  319. Mode : { $$.Mode.IsRef := FALSE;
  320.  ;
  321. } .
  322. Mode : REF { $$.Mode.IsRef := TRUE ;
  323.  ;
  324. } .
  325. Declarations : Ident ':' Type { $$.Declarations.Tree := mParam (FALSE, $1.Scan.Ident.Ident, $1.Scan.Position, $3.Type.Tree, nNoParameter);
  326.  ;
  327. } .
  328. Declarations : Ident ':' Type ',' Declarations { $$.Declarations.Tree := mParam (FALSE, $1.Scan.Ident.Ident, $1.Scan.Position, $3.Type.Tree, $5.Declarations.Tree);
  329.  ;
  330. } .
  331. Type : Ident { $$.Type.Tree := mType ($1.Scan.Ident.Ident, $1.Scan.Position, nNoName);
  332.  ;
  333. } .
  334. Type : Ident '.' Name0 { $$.Type.Tree := mType ($1.Scan.Ident.Ident, $1.Scan.Position, mName ($3.Name0.Id, $3.Name0.Position, nNoName));
  335.  ;
  336. } .
  337. Type : '[' Names ']' { $$.Type.Tree := mType (NoIdent, $1.Scan.Position, ReverseTree ($2.Names.Tree));
  338.  ;
  339. } .
  340. Type : Ident '.' '[' Names ']' { $$.Type.Tree := mType ($1.Scan.Ident.Ident, $1.Scan.Position, ReverseTree ($4.Names.Tree));
  341.  ;
  342. } .
  343. LocalCode : { MakeText ($$.LocalCode.Text); ;
  344.  $$.LocalCode.Position := NoPosition;
  345.  ;
  346. } .
  347. LocalCode : 'LOCAL' TargetBlock {$$.LocalCode.Position := $2.Scan.Position;
  348. $$.LocalCode.Text := $2.Scan.TargetBlock.Text;
  349. } .
  350. Rules : { $$.Rules.Tree := nNoRule;
  351.  ;
  352. } .
  353. Rules : Rules SetLine Patterns2 '.' { $$.Rules.Tree := mRules (Line, $3.Patterns2.Tree, mNoExpr ($4.Scan.Position),
  354.            mNoExpr ($4.Scan.Position), nNoStatement, $1.Rules.Tree);
  355.  ;
  356. } .
  357. Rules : Rules SetLine Patterns '?' Statements '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, mNoExpr ($6.Scan.Position),
  358.            mNoExpr ($6.Scan.Position), ReverseTree ($5.Statements.Tree), $1.Rules.Tree);
  359.  ;
  360. } .
  361. Rules : Rules SetLine Patterns '=>' Exprs2 '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $5.Exprs2.Tree, mNoExpr ($6.Scan.Position),
  362.            nNoStatement, $1.Rules.Tree);
  363.  ;
  364. } .
  365. Rules : Rules SetLine Patterns RETURN Expr ';' '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, mNoExpr ($7.Scan.Position), $5.Expr.Tree,
  366.            nNoStatement, $1.Rules.Tree);
  367.  ;
  368. } .
  369. Rules : Rules SetLine Patterns '=>' Exprs '?' Statements '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $5.Exprs.Tree, mNoExpr ($8.Scan.Position),
  370.            ReverseTree ($7.Statements.Tree), $1.Rules.Tree);
  371.  ;
  372. } .
  373. Rules : Rules SetLine Patterns '?' Statements '=>' Exprs2 '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $7.Exprs2.Tree, mNoExpr ($8.Scan.Position),
  374.            ReverseTree ($5.Statements.Tree), $1.Rules.Tree);
  375.  ;
  376. } .
  377. Rules : Rules SetLine Patterns '=>' Exprs RETURN Expr ';' '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $5.Exprs.Tree, $7.Expr.Tree,
  378.            nNoStatement, $1.Rules.Tree);
  379.  ;
  380. } .
  381. Rules : Rules SetLine Patterns RETURN Expr OptSemiColon '?' Statements '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, mNoExpr ($9.Scan.Position), $5.Expr.Tree,
  382.            ReverseTree ($8.Statements.Tree), $1.Rules.Tree);
  383.  ;
  384. } .
  385. Rules : Rules SetLine Patterns '?' Statements RETURN Expr ';' '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, mNoExpr ($9.Scan.Position), $7.Expr.Tree,
  386.            ReverseTree ($5.Statements.Tree), $1.Rules.Tree);
  387.  ;
  388. } .
  389. Rules : Rules SetLine Patterns '=>' Exprs RETURN Expr OptSemiColon '?' Statements '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $5.Exprs.Tree, $7.Expr.Tree,
  390.            ReverseTree ($10.Statements.Tree), $1.Rules.Tree);
  391.  ;
  392. } .
  393. Rules : Rules SetLine Patterns '=>' Exprs '?' Statements RETURN Expr ';' '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $5.Exprs.Tree, $9.Expr.Tree,
  394.            ReverseTree ($7.Statements.Tree), $1.Rules.Tree);
  395.  ;
  396. } .
  397. Rules : Rules SetLine Patterns '?' Statements '=>' Exprs RETURN Expr ';' '.' { $$.Rules.Tree := mRules (Line, $3.Patterns.Tree, $7.Exprs.Tree, $9.Expr.Tree,
  398.            ReverseTree ($5.Statements.Tree), $1.Rules.Tree);
  399.  ;
  400. } .
  401. SetLine : { ;
  402.  Line := Attribute.Position; ;
  403.  ;
  404. } .
  405. OptSemiColon : .
  406. OptSemiColon : ';' .
  407. Patterns : Exprs { $$.Patterns.Tree := mOnePatternsList ($1.Exprs.Tree, nNoPatternsList);
  408.  ;
  409. } .
  410. Patterns : Exprs ';' Patterns { $$.Patterns.Tree := mOnePatternsList ($1.Exprs.Tree, $3.Patterns.Tree);
  411.  ;
  412. } .
  413. Patterns2 : Exprs ';' { $$.Patterns2.Tree := mOnePatternsList ($1.Exprs.Tree, nNoPatternsList);
  414.  ;
  415. } .
  416. Patterns2 : Exprs ';' Patterns2 { $$.Patterns2.Tree := mOnePatternsList ($1.Exprs.Tree, $3.Patterns2.Tree);
  417.  ;
  418. } .
  419. Exprs : '..' { $$.Exprs.Tree := mOneExpr (mDontCare ($1.Scan.Position), mNoExpr (Attribute.Position));
  420.  ;
  421. } .
  422. Exprs : '..' ',' { $$.Exprs.Tree := mOneExpr (mDontCare ($1.Scan.Position), mNoExpr (Attribute.Position));
  423.  ;
  424. } .
  425. Exprs : Expr { $$.Exprs.Tree := mOneExpr ($1.Expr.Tree, mNoExpr (Attribute.Position));
  426.  ;
  427. } .
  428. Exprs : Expr ',' Exprs { $$.Exprs.Tree := mOneExpr ($1.Expr.Tree, $3.Exprs.Tree);
  429.  ;
  430. } .
  431. Exprs : NamedExprs {$$.Exprs.Tree := $1.NamedExprs.Tree;
  432. } .
  433. NamedExprs : { $$.NamedExprs.Tree := mNoExpr (Attribute.Position);
  434.  ;
  435. } .
  436. NamedExprs : Ident ':=' Expr { $$.NamedExprs.Tree := mNamedExpr ($3.Expr.Tree, mNoExpr (Attribute.Position), $1.Scan.Ident.Ident);
  437.  ;
  438. } .
  439. NamedExprs : Ident ':=' Expr ',' NamedExprs { $$.NamedExprs.Tree := mNamedExpr ($3.Expr.Tree, $5.NamedExprs.Tree, $1.Scan.Ident.Ident);
  440.  ;
  441. } .
  442. Exprs2 : '..' { $$.Exprs2.Tree := mOneExpr (mDontCare ($1.Scan.Position), mNoExpr (Attribute.Position));
  443.  ;
  444. } .
  445. Exprs2 : '..' ',' { $$.Exprs2.Tree := mOneExpr (mDontCare ($1.Scan.Position), mNoExpr (Attribute.Position));
  446.  ;
  447. } .
  448. Exprs2 : Expr ',' Exprs2 { $$.Exprs2.Tree := mOneExpr ($1.Expr.Tree, $3.Exprs2.Tree);
  449.  ;
  450. } .
  451. Exprs2 : NamedExprs2 {$$.Exprs2.Tree := $1.NamedExprs2.Tree;
  452. } .
  453. NamedExprs2 : { $$.NamedExprs2.Tree := mNoExpr (Attribute.Position);
  454.  ;
  455. } .
  456. NamedExprs2 : Ident ':=' Expr ',' NamedExprs2 { $$.NamedExprs2.Tree := mNamedExpr ($3.Expr.Tree, $5.NamedExprs2.Tree, $1.Scan.Ident.Ident);
  457.  ;
  458. } .
  459. Expr : PrefixExpr {$$.Expr.Tree := $1.PrefixExpr.Tree;
  460. } .
  461. Expr : Expr Operator PrefixExpr { $$.Expr.Tree := mBinary ($2.Scan.Position, $1.Expr.Tree, $2.Scan.Operator.Ident, $3.PrefixExpr.Tree);
  462.  ;
  463. } .
  464. PrefixExpr : PostfixExpr {$$.PrefixExpr.Tree := $1.PostfixExpr.Tree;
  465. } .
  466. PrefixExpr : Ident ':' PostfixExpr {
  467.         $$.PrefixExpr.Tree := $3.PostfixExpr.Tree;
  468.         IF $$.PrefixExpr.Tree^.Kind = Compose THEN
  469.            $$.PrefixExpr.Tree^.Compose.Selector := $1.Scan.Ident.Ident;
  470.         ELSIF $$.PrefixExpr.Tree^.Kind = Nil THEN
  471.            $$.PrefixExpr.Tree^.Nil.Selector := $1.Scan.Ident.Ident;
  472.         ELSIF $$.PrefixExpr.Tree^.Kind = VarUse THEN
  473.            $$.PrefixExpr.Tree := mCompose ($$.PrefixExpr.Tree^.VarUse.Pos, $1.Scan.Ident.Ident, $$.PrefixExpr.Tree,
  474.                mOneExpr (mDontCare ($$.PrefixExpr.Tree^.VarUse.Pos),
  475.                mNoExpr ($$.PrefixExpr.Tree^.VarUse.Pos)), FALSE);
  476.         ELSE
  477.            Warning ("label ignored", $1.Scan.Position);
  478.         END; ;
  479.  ;
  480. } .
  481. PrefixExpr : Ident ':>' PostfixExpr {
  482.         $$.PrefixExpr.Tree := $3.PostfixExpr.Tree;
  483.         IF $$.PrefixExpr.Tree^.Kind = Compose THEN
  484.            $$.PrefixExpr.Tree^.Compose.Selector := $1.Scan.Ident.Ident;
  485.            $$.PrefixExpr.Tree^.Compose.Widen := TRUE;
  486.         ELSIF $$.PrefixExpr.Tree^.Kind = Nil THEN
  487.            $$.PrefixExpr.Tree^.Nil.Selector := $1.Scan.Ident.Ident;
  488.         ELSIF $$.PrefixExpr.Tree^.Kind = VarUse THEN
  489.            $$.PrefixExpr.Tree := mCompose ($$.PrefixExpr.Tree^.VarUse.Pos, $1.Scan.Ident.Ident, $$.PrefixExpr.Tree,
  490.                mOneExpr (mDontCare ($$.PrefixExpr.Tree^.VarUse.Pos),
  491.                mNoExpr ($$.PrefixExpr.Tree^.VarUse.Pos)), TRUE);
  492.         ELSE
  493.            Warning ("label ignored", $1.Scan.Position);
  494.         END; ;
  495.  ;
  496. } .
  497. PrefixExpr : Operator PrefixExpr { $$.PrefixExpr.Tree := mPreOperator ($1.Scan.Position, $1.Scan.Operator.Ident, $2.PrefixExpr.Tree);
  498.  ;
  499. } .
  500. PrefixExpr : IncOperator PrefixExpr { $$.PrefixExpr.Tree := mPreOperator ($1.Scan.Position, $1.Scan.IncOperator.Ident, $2.PrefixExpr.Tree);
  501.  ;
  502. } .
  503. PostfixExpr : PrimaryExpr {$$.PostfixExpr.Tree := $1.PrimaryExpr.Tree;
  504. } .
  505. PostfixExpr : PostfixExpr '[' Exprs ']' { $$.PostfixExpr.Tree := mIndex ($2.Scan.Position, $1.PostfixExpr.Tree, $3.Exprs.Tree);
  506.  ;
  507. } .
  508. PostfixExpr : PostfixExpr '(' Exprs ')' { $$.PostfixExpr.Tree := mCompose ($2.Scan.Position, NoIdent, $1.PostfixExpr.Tree, $3.Exprs.Tree, FALSE);
  509.  ;
  510. } .
  511. PostfixExpr : PostfixExpr '(' Exprs '=>' Exprs ')' { $$.PostfixExpr.Tree := mCall ($2.Scan.Position, $1.PostfixExpr.Tree, $3.Exprs.Tree, $5.Exprs.Tree);
  512.  ;
  513. } .
  514. PostfixExpr : PostfixExpr '.' Ident { ArrayToString (".", String1);
  515.         $$.PostfixExpr.Tree := mBinary ($2.Scan.Position, $1.PostfixExpr.Tree, MakeIdent (String1),
  516.               mVarUse ($3.Scan.Position, $3.Scan.Ident.Ident)); ;
  517.  ;
  518. } .
  519. PostfixExpr : PostfixExpr '->' Ident { ArrayToString ("->", String1);
  520.         $$.PostfixExpr.Tree := mBinary ($2.Scan.Position, $1.PostfixExpr.Tree, MakeIdent (String1),
  521.               mVarUse ($3.Scan.Position, $3.Scan.Ident.Ident)); ;
  522.  ;
  523. } .
  524. PostfixExpr : PostfixExpr '^' { ArrayToString ("^", String1);
  525.         $$.PostfixExpr.Tree := mPostOperator ($2.Scan.Position, MakeIdent (String1), $1.PostfixExpr.Tree); ;
  526.  ;
  527. } .
  528. PostfixExpr : PostfixExpr IncOperator { $$.PostfixExpr.Tree := mPostOperator ($2.Scan.Position, $2.Scan.IncOperator.Ident, $1.PostfixExpr.Tree);
  529.  ;
  530. } .
  531. PrimaryExpr : Ident { $$.PrimaryExpr.Tree := mVarUse ($1.Scan.Position, $1.Scan.Ident.Ident);
  532.  ;
  533. } .
  534. PrimaryExpr : NIL { $$.PrimaryExpr.Tree := mNil ($1.Scan.Position, NoIdent);
  535.  ;
  536. } .
  537. PrimaryExpr : '_' { $$.PrimaryExpr.Tree := mDontCare1 ($1.Scan.Position);
  538.  ;
  539. } .
  540. PrimaryExpr : Number { $$.PrimaryExpr.Tree := mTargetExpr ($1.Scan.Position, mAny ($1.Scan.Number.StringRef, nNoDesignator));
  541.  ;
  542. } .
  543. PrimaryExpr : String { $$.PrimaryExpr.Tree := mStringExpr ($1.Scan.Position, $1.Scan.String.StringRef);
  544.  ;
  545. } .
  546. PrimaryExpr : Ident '::' Ident { $$.PrimaryExpr.Tree := mAttrDesc ($3.Scan.Position, $1.Scan.Ident.Ident, $3.Scan.Ident.Ident);
  547.  ;
  548. } .
  549. PrimaryExpr : '{' TargetCodes '}' { $$.PrimaryExpr.Tree := mTargetExpr ($1.Scan.Position, ReverseTree ($2.TargetCodes.Tree));
  550.  ;
  551. } PREC '{' .
  552. PrimaryExpr : '(' Expr ')' { $$.PrimaryExpr.Tree := mParents ($1.Scan.Position, $2.Expr.Tree);
  553.  ;
  554. } .
  555. Statements : { $$.Statements.Tree := nNoStatement;
  556.  ;
  557. } .
  558. Statements : Statements Expr ';' { $$.Statements.Tree := mProcCall ($2.Expr.Tree^.Expr.Pos, $1.Statements.Tree, $2.Expr.Tree);
  559.  ;
  560. } .
  561. Statements : Statements Expr ':=' Expr ';' { $$.Statements.Tree := mAssignment ($3.Scan.Position, $1.Statements.Tree, $2.Expr.Tree, $4.Expr.Tree);
  562.  ;
  563. } .
  564. Statements : Statements REJECT { $$.Statements.Tree := mReject ($2.Scan.Position, $1.Statements.Tree);
  565.  ;
  566. } .
  567. Statements : Statements FAIL { $$.Statements.Tree := mFail ($2.Scan.Position, $1.Statements.Tree);
  568.  ;
  569. } .
  570. Statements : Statements Declarations ';' { $$.Statements.Tree := mTargetStmt ($3.Scan.Position, $1.Statements.Tree, $2.Declarations.Tree, nNoDesignator);
  571.  ;
  572. } .
  573. Statements : Statements '{' TargetCodes '}' ';' { $$.Statements.Tree := mTargetStmt ($2.Scan.Position, $1.Statements.Tree, nNoParameter, ReverseTree ($3.TargetCodes.Tree));
  574.  ;
  575. } .
  576. Statements : Statements NL { $$.Statements.Tree := mNl ($2.Scan.Position, $1.Statements.Tree);
  577.  ;
  578. } .
  579. Statements : Statements ';' {$$.Statements.Tree := $1.Statements.Tree;
  580. } .
  581. TargetCodes : { $$.TargetCodes.Tree := nNoDesignator;
  582.  ;
  583. } .
  584. TargetCodes : TargetCodes Name1 Space '::' Space Ident { $$.TargetCodes.Tree := mDesignator ($2.Name1.Id, $6.Scan.Ident.Ident, $2.Name1.Position, $1.TargetCodes.Tree);
  585.  ;
  586. } .
  587. TargetCodes : TargetCodes Name1 Space '::' Space {
  588.         $$.TargetCodes.Tree := mIdent ($2.Name1.Id, $2.Name1.Position, $1.TargetCodes.Tree);
  589.         $$.TargetCodes.Tree := mAnys (ReverseTree ($3.Space.Tree), $$.TargetCodes.Tree);
  590.         $$.TargetCodes.Tree := mAny ($4.Scan.yy9.StringRef, $$.TargetCodes.Tree);
  591.         $$.TargetCodes.Tree := mAnys (ReverseTree ($5.Space.Tree), $$.TargetCodes.Tree); ;
  592.  ;
  593. } .
  594. TargetCodes : TargetCodes Name1 Space {
  595.         $$.TargetCodes.Tree := mIdent ($2.Name1.Id, $2.Name1.Position, $1.TargetCodes.Tree);
  596.         $$.TargetCodes.Tree := mAnys (ReverseTree ($3.Space.Tree), $$.TargetCodes.Tree); ;
  597.  ;
  598. } .
  599. TargetCodes : TargetCodes '::' { $$.TargetCodes.Tree := mAny ($2.Scan.yy9.StringRef, $1.TargetCodes.Tree);
  600.  ;
  601. } .
  602. TargetCodes : TargetCodes TargetCode { $$.TargetCodes.Tree := mAny ($2.Scan.TargetCode.StringRef, $1.TargetCodes.Tree);
  603.  ;
  604. } .
  605. TargetCodes : TargetCodes WhiteSpace { $$.TargetCodes.Tree := mAny ($2.Scan.WhiteSpace.StringRef, $1.TargetCodes.Tree);
  606.  ;
  607. } .
  608. Name0 : Ident { $$.Name0.Id         :=  $1.Scan.Ident.Ident;
  609.  
  610.         $$.Name0.Position     :=  $1.Scan.Position;
  611.  ;
  612. } .
  613. Name0 : String { GetString ($1.Scan.String.StringRef, String1);
  614.                  SubString (String1, 2, Length (String1) - 1, String2);
  615.                  $$.Name0.Id := MakeIdent (String2); ;
  616.  
  617.         $$.Name0.Position     :=  $1.Scan.Position;
  618.  ;
  619. } .
  620. Name1 : Ident { $$.Name1.Id     :=  $1.Scan.Ident.Ident;
  621.  
  622.         $$.Name1.Position     :=  $1.Scan.Position;
  623.  ;
  624. } .
  625. Name1 : String { GetString ($1.Scan.String.StringRef, String1); $$.Name1.Id := MakeIdent (String1); ;
  626.  
  627.         $$.Name1.Position     :=  $1.Scan.Position;
  628.  ;
  629. } .
  630. Space : { $$.Space.Tree := nNoLayout;
  631.  ;
  632. } .
  633. Space : Space WhiteSpace { $$.Space.Tree := mLayoutAny ($2.Scan.WhiteSpace.StringRef, $1.Space.Tree);
  634.  ;
  635. } .
  636.